﻿using System.IO.Ports;

namespace ModbusComRtu
{
    public class Program
    {
        static void Main(string[] args)
        {
            SerialPort serialPort = new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);
            try
            {
                serialPort.Open();
                Console.WriteLine("串口已打开");

                //构建Modbus RTU数据  --> 从设备
                byte[] message = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01 };// 读取寄存器的请求
                serialPort.Write(message, 0, message.Length);
                Console.WriteLine("Modbus RTU请求数据已发送");


                //接受响应
                byte[] response = new byte[256];
                int bytesRead = serialPort.Read(response, 0, response.Length);
                Console.WriteLine($"接收到的字节数: {bytesRead}");

                //解析响应
                for (int i = 0; i < bytesRead; i++)
                {
                    //根据具体协议解析数据
                    //Console.Write(response[i].ToString("X2") + " ");
                }

            }
            catch (Exception ex)
            {
                Console.WriteLine("串口打开失败：" + ex.Message);
            }
            finally
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                    Console.WriteLine("串口已关闭");
                }
            }
        }
    }
}



#region Modbus RTU协议 需要两台电脑验证
//byte[] message = new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x01 };
//各字节的含义
//0x01（从地址）：
//这是从站的地址，表示你要请求的 Modbus 设备的地址。在这个例子中，从站地址是 1。Modbus 网络上每个设备都有一个唯一的地址。

//0x03（功能码）：
//功能码表示请求的操作类型。在这个例子中，0x03 表示读取保持寄存器（Read Holding Registers）。

//0x00 0x00（起始寄存器地址）：
//这两个字节表示要读取的寄存器的起始地址。这里的 0x00 0x00 表示从地址 0 开始读取。

//0x00 0x01（寄存器数量）：
//这两个字节表示要读取的寄存器数量。在这个例子中，0x00 0x01 表示读取 1 个寄存器。
#endregion